{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
    "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['monkey_labels.txt', 'validation', 'training']\n"
     ]
    }
   ],
   "source": [
    "# This Python 3 environment comes with many helpful analytics libraries installed\n",
    "# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n",
    "# For example, here's several helpful packages to load in \n",
    "\n",
    "import numpy as np # linear algebra\n",
    "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
    "\n",
    "# Input data files are available in the \"../input/\" directory.\n",
    "# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n",
    "\n",
    "import os\n",
    "print(os.listdir(\"../input\"))\n",
    "\n",
    "# Any results you write to the current directory are saved as output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
    "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.13.1\n",
      "sys.version_info(major=3, minor=6, micro=6, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.3\n",
      "pandas 0.23.4\n",
      "sklearn 0.20.3\n",
      "tensorflow 1.13.1\n",
      "tensorflow._api.v1.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "import pandas as pd\n",
    "import sklearn\n",
    "import sys\n",
    "import tensorflow as tf\n",
    "import time\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "'''\n",
    "使用ten-monkey，训练猴子分类模型\n",
    "1. 从文件中读取猴子图像信息，猴子的具体分类就是当前的文件夹名称（有个labels.txt会将从文件名对应猴子名）、\n",
    "2. 从上面一部中就能进行数据增强（通过增加很多扰乱数据，增加训练数据的数量 与 模型的鲁棒性）\n",
    "    也能够获取生成器，可通过train_generator.next() 获取一个batch_size的数据\n",
    "3. 创建模型对象，Conv2D + MaxPool2D + Dense\n",
    "4. 调用model.fit_generator()，传入生成器，训练模型\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "True\n",
      "['n3', 'n5', 'n2', 'n4', 'n8', 'n9', 'n6', 'n0', 'n1', 'n7']\n",
      "['n3', 'n5', 'n2', 'n4', 'n8', 'n9', 'n6', 'n0', 'n1', 'n7']\n"
     ]
    }
   ],
   "source": [
    "train_dir = \"../input/training/training\"\n",
    "valid_dir = \"../input/validation/validation\"\n",
    "label_file = \"../input/monkey_labels.txt\"\n",
    "print(os.path.exists(train_dir))\n",
    "print(os.path.exists(valid_dir))\n",
    "print(os.path.exists(label_file))\n",
    "\n",
    "print(os.listdir(train_dir))\n",
    "print(os.listdir(valid_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   Label        ...          Validation Images\n",
      "0  n0           ...                         26\n",
      "1  n1           ...                         28\n",
      "2  n2           ...                         27\n",
      "3  n3           ...                         30\n",
      "4  n4           ...                         26\n",
      "5  n5           ...                         28\n",
      "6  n6           ...                         26\n",
      "7  n7           ...                         28\n",
      "8  n8           ...                         27\n",
      "9  n9           ...                         26\n",
      "\n",
      "[10 rows x 5 columns]\n"
     ]
    }
   ],
   "source": [
    "## 读取label文件\n",
    "labels = pd.read_csv(label_file, header=0)\n",
    "print(labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 1097 images belonging to 10 classes.\n",
      "Found 272 images belonging to 10 classes.\n",
      "1097 272\n"
     ]
    }
   ],
   "source": [
    "## 设置图片读取器\n",
    "height = 128\n",
    "width = 128\n",
    "channels = 3\n",
    "batch_size = 64\n",
    "num_classes = 10\n",
    "\n",
    "## 使用keras封装的api读取文件数据\n",
    "## ImageDataGenerator 是个图像读取与预处理的类\n",
    "## 并实现数据增强，增加数据量\n",
    "train_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    ## 指定图片中像素点缩放\n",
    "    rescale = 1./255,\n",
    "    rotation_range = 40,\n",
    "    width_shift_range = 0.2,\n",
    "    height_shift_range = 0.2,\n",
    "    shear_range = 0.2,\n",
    "    zoom_range = 0.2,\n",
    "    horizontal_flip = True,\n",
    "    fill_mode = 'nearest',\n",
    ")\n",
    "\n",
    "## 调用生成器的 flow_from_director方法，\n",
    "## 从指定文件夹中获取图片数据\n",
    "train_generator = train_datagen.flow_from_directory(train_dir,\n",
    "                                                   target_size = (height, width),\n",
    "                                                   batch_size = batch_size,\n",
    "                                                   seed = 7,\n",
    "                                                    ## 虽然在这里进行了混排，但是文件的类型终究是更具文件夹所判断的，\n",
    "                                                    ## 对应关系不会发生变化\n",
    "                                                   shuffle = True,\n",
    "                                                    ## 对数据label实现one-hot编码\n",
    "                                                   class_mode = \"categorical\")\n",
    "\n",
    "valid_datagen = keras.preprocessing.image.ImageDataGenerator(rescale = 1./255)\n",
    "valid_generator = valid_datagen.flow_from_directory(valid_dir,\n",
    "                                                    target_size = (height, width),\n",
    "                                                    batch_size = batch_size,\n",
    "                                                    seed = 7,\n",
    "                                                    shuffle = False,\n",
    "                                                    class_mode = \"categorical\")\n",
    "train_num = train_generator.samples\n",
    "valid_num = valid_generator.samples\n",
    "print(train_num, valid_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(64, 128, 128, 3) (64, 10)\n",
      "[[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]\n",
      "(64, 128, 128, 3) (64, 10)\n",
      "[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]]\n"
     ]
    }
   ],
   "source": [
    "## 可以看出 train_generator中的每份数据，都是numpy格式\n",
    "## 其中bathc_size=64\n",
    "## 每份中（128，128，3）表示图片信息\n",
    "## （，10）那个10个元素的向量，表示的是分类的one-hot码\n",
    "for i in range(2):\n",
    "    x, y = train_generator.next()\n",
    "    print(x.shape, y.shape)\n",
    "    print(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 128, 128, 32)      896       \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 128, 128, 32)      9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 64, 64, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 64, 64, 64)        18496     \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 64, 64, 64)        36928     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 32, 32, 64)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 32, 32, 128)       73856     \n",
      "_________________________________________________________________\n",
      "conv2d_5 (Conv2D)            (None, 32, 32, 128)       147584    \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 16, 16, 128)       0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 32768)             0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               4194432   \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 4,482,730\n",
      "Trainable params: 4,482,730\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "## 训练模型\n",
    "model = keras.models.Sequential([\n",
    "    ## 卷积层，指定输入图片数据的 shape\n",
    "    ## padding = same 表示会在输出属于与输入数据长宽相同\n",
    "    ## filter=32 有32个卷积核，出来的结果相当于有32个通道\n",
    "    ## 默认水平垂直步长都是1\n",
    "    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',\n",
    "                        activation='relu', input_shape=[width, height, channels]),\n",
    "    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    ## 池化，在2*2数据矩阵中，池化为1个，且抛弃最后不足的数据\n",
    "    ## 池化后，面积会为原来的1/4，一般来说，池化的步长=size\n",
    "    ## 数据 变成一维的 ，通道消失\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    \n",
    "    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',\n",
    "                        activation='relu'),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    \n",
    "    ## 将二维数据展平为一维 向量，传递给Dense  layer\n",
    "    keras.layers.Flatten(),\n",
    "    keras.layers.Dense(128, activation='relu'),\n",
    "    \n",
    "    ## 最终 分类\n",
    "    keras.layers.Dense(num_classes, activation='softmax'),\n",
    "])\n",
    "\n",
    "model.compile(loss=\"categorical_crossentropy\",\n",
    "              optimizer=\"adam\", metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.cast instead.\n",
      "Epoch 1/10\n",
      "5/5 [==============================] - 12s 2s/step - loss: 2.2959 - acc: 0.1728\n",
      "18/18 [==============================] - 42s 2s/step - loss: 2.3368 - acc: 0.1094 - val_loss: 2.2959 - val_acc: 0.1728\n",
      "Epoch 2/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 2.1253 - acc: 0.1801\n",
      "18/18 [==============================] - 34s 2s/step - loss: 2.2703 - acc: 0.1522 - val_loss: 2.1253 - val_acc: 0.1801\n",
      "Epoch 3/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 2.0804 - acc: 0.2500\n",
      "18/18 [==============================] - 34s 2s/step - loss: 2.0478 - acc: 0.2434 - val_loss: 2.0804 - val_acc: 0.2500\n",
      "Epoch 4/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 1.7703 - acc: 0.3676\n",
      "18/18 [==============================] - 34s 2s/step - loss: 1.8793 - acc: 0.3355 - val_loss: 1.7703 - val_acc: 0.3676\n",
      "Epoch 5/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 1.7720 - acc: 0.3934\n",
      "18/18 [==============================] - 33s 2s/step - loss: 1.7637 - acc: 0.3391 - val_loss: 1.7720 - val_acc: 0.3934\n",
      "Epoch 6/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 1.6072 - acc: 0.4154\n",
      "18/18 [==============================] - 33s 2s/step - loss: 1.7476 - acc: 0.3610 - val_loss: 1.6072 - val_acc: 0.4154\n",
      "Epoch 7/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 1.5156 - acc: 0.4706\n",
      "18/18 [==============================] - 33s 2s/step - loss: 1.6277 - acc: 0.4184 - val_loss: 1.5156 - val_acc: 0.4706\n",
      "Epoch 8/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 1.4898 - acc: 0.4301\n",
      "18/18 [==============================] - 33s 2s/step - loss: 1.5653 - acc: 0.4394 - val_loss: 1.4898 - val_acc: 0.4301\n",
      "Epoch 9/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 1.4042 - acc: 0.5074\n",
      "18/18 [==============================] - 33s 2s/step - loss: 1.4977 - acc: 0.4686 - val_loss: 1.4042 - val_acc: 0.5074\n",
      "Epoch 10/10\n",
      "5/5 [==============================] - 11s 2s/step - loss: 1.3682 - acc: 0.4779\n",
      "18/18 [==============================] - 33s 2s/step - loss: 1.4121 - acc: 0.4995 - val_loss: 1.3682 - val_acc: 0.4779\n"
     ]
    }
   ],
   "source": [
    "epochs = 10\n",
    "## 因为数据的来源是 generator，是个生成器\n",
    "## 因此，使用fit_generator，它内部会对每个train_generator调用 next()操作 \n",
    "history = model.fit_generator(train_generator,\n",
    "                              steps_per_epoch = train_num // batch_size,\n",
    "                              epochs = epochs,\n",
    "                              validation_data = valid_generator,\n",
    "                              validation_steps = valid_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAekAAAEzCAYAAAAVa/veAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8VdW99/HPyjyHjISQAGEKEDDMIlgNghXUorVatLW11tY+bb3aanvrtb1tn2qn216rfWpbqUP13l6ttXLFirOkKgiCCAJhHjMQIAOZQ07OWc8f+0DCmADn5Owk3/frdV45wzr7/M56Qb5Ze6+9trHWIiIiIu4TFuoCRERE5NQU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUl2GtDHmCWPMQWPMxtO8bowxvzXG7DDGfGyMmRz4MkVERPqf7oyk/wzMO8Pr84FR/tvtwB/OvywRERHpMqStte8ANWdocg3wtHWsBAYYYwYFqkAREZH+KhDHpAcDpZ0el/mfExERkfMQ0ZMfZoy5HWeXODExMVOGDBnSkx/f7/h8PsLCNDcw2NTPwac+Dj71cfBt27atylqbcTbvCURIlwO5nR7n+J87ibV2EbAIID8/327dujUAHy+nU1xcTFFRUajL6PPUz8GnPg4+9XHwGWP2nu17AvFn0xLgi/5Z3jOAOmvt/gBsV0REpF/rciRtjHkGKALSjTFlwI+ASABr7R+BpcCVwA6gGbg1WMWKiIj0J12GtLX2pi5et8A3A1aRiIiIAD08cUxERHo/j8dDWVkZra2toS7FlWJiYsjJySEyMvK8t6WQFhGRs1JWVkZiYiLDhg3DGBPqclzFWkt1dTVlZWXk5eWd9/Y0315ERM5Ka2sraWlpCuhTMMaQlpYWsL0MCmkRETlrCujTC2TfKKRFRERcSiEtIiLiUgppERHpla699lqmTJlCQUEBixYtAuDVV19l8uTJFBYWMmfOHAAaGxu59dZbmTBhAhdccAF///vfQ1n2WdHsbhER6ZWeeOIJUlNTaWlpYdq0aVxzzTV89atf5Z133iEvL4+aGucCjvfffz/Jycls2LABgNra2lCWfVYU0iIics7+70ubKKmoD+g2x2Un8aNPFXTZ7re//S2LFy8GoLS0lEWLFnHJJZccO/UpNTUVgDfffJNnn3322PtSUlICWm8waXe3iIj0OsXFxbz55pu8//77rF+/nkmTJjFx4sRQlxVwGkmLiMg5686INxjq6upISUkhLi6OLVu2sHLlSlpbW3nnnXfYvXv3sd3dqampXH755TzyyCM89NBDgLO7u7eMpjWSFhGRXmfevHm0t7czduxY7r33XmbMmEFGRgaLFi3iuuuuo7CwkIULFwLwgx/8gNraWsaPH09hYSHLli0LcfXdp5G0iIj0OtHR0bzyyiunfG3+/PnHPU5ISOCpp57qibICTiNpERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiJ9XkJCQqhLOCcKaREREZdSSIuISK9z77338sgjjxx7/OMf/5gHHniAOXPmMHnyZCZMmMCLL77YrW01Njae9n1PP/00F1xwAYWFhXzhC18A4MCBA3z605+msLCQwsJCVqxYEdgv14mWBRURkXP3yr1QuSGw28yaAPN/ccYmCxcu5Fvf+hbf/OY3AXjuued47bXXuPPOO0lKSqKqqooZM2awYMECjDFn3FZMTAyLFy8+6X0lJSU88MADrFixgvT09GPXp77zzju59NJLWbx4MV6vl8bGxsB871NQSIuISK8zadIkDh48SEVFBYcOHSIlJYWsrCy+/e1v88477xAWFkZ5eTkHDhwgKyvrjNuy1nLfffed9L63336bG264gfT0dKDj+tRvv/02Tz/9NADh4eEkJycH7XsqpEVE5Nx1MeINphtuuIHnn3+eyspKFi5cyF/+8hcOHTrEhx9+SGRkJMOGDaO1tbXL7Zzr+3qCjkmLiEivtHDhQp599lmef/55brjhBurq6sjMzCQyMpJly5axd+/ebm3ndO+77LLL+Nvf/kZ1dTXAsd3dc+bM4Q9/+AMAXq+Xurq6IHw7h0JaRER6pYKCAhoaGhg8eDCDBg3i85//PGvWrGHChAk8/fTTjBkzplvbOd37CgoK+P73v8+ll15KYWEhd999NwAPP/wwy5YtY8KECUyZMoWSkpKgfUft7hYRkV5rw4aOSWvp6em8//77p2x3psldZ3rfLbfcwi233HLccwMHDuz2zPHzpZG0iIiIS2kkLSIi/cKGDRuOnet8VHR0NKtWrQpRRV1TSIuISL8wYcIE1q1bF+oyzop2d4uIyFmz1oa6BNcKZN8opEVE5KzExMRQXV2toD4Fay3V1dXExMQEZHva3S0iImclJyeHsrIyDh06FOpSXCkmJoacnJyAbEshLSIiZyUyMpK8vLxQl9EvaHe3iIiISymkRUREXEohLSIi4lIKaREREZdSSIuIiLiUQlpERMSlFNIiIiIupZAWERFxKYW0iIiISymkRUREXKpbIW2MmWeM2WqM2WGMufcUrw8xxiwzxnxkjPnYGHNl4EsVERHpX7oMaWNMOPAIMB8YB9xkjBl3QrMfAM9ZaycBNwK/D3ShIiIi/U13RtLTgR3W2l3W2jbgWeCaE9pYIMl/PxmoCFyJIiIi/VN3roI1GCjt9LgMuPCENj8GXjfG/AsQD8w91YaMMbcDtwNkZGRQXFx8luXK2WhsbFQf9wD1c/Cpj4NPfexOgbpU5U3An621/2mMuQj4L2PMeGutr3Mja+0iYBFAfn6+LSoqCtDHy6kUFxejPg4+9XPwqY+DT33sTt3Z3V0O5HZ6nON/rrPbgOcArLXvAzFAeiAKFBER6a+6E9KrgVHGmDxjTBTOxLAlJ7TZB8wBMMaMxQnpQ4EsVEREpL/pMqStte3AHcBrwGacWdybjDE/McYs8De7B/iqMWY98AzwJWutDVbRIiIi/UG3jklba5cCS0947oed7pcAswJbmoiISP+mFcdERERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKW6FdLGmHnGmK3GmB3GmHtP0+azxpgSY8wmY8z/BLZMERGR/ieiqwbGmHDgEeByoAxYbYxZYq0t6dRmFPBvwCxrba0xJjNYBYuIiPQX3RlJTwd2WGt3WWvbgGeBa05o81XgEWttLYC19mBgyxQREel/uhPSg4HSTo/L/M91NhoYbYxZboxZaYyZF6gCRURE+qsud3efxXZGAUVADvCOMWaCtfZw50bGmNuB2wEyMjIoLi4O0MfLqTQ2NqqPe4D6OfjUx8GnPnan7oR0OZDb6XGO/7nOyoBV1loPsNsYsw0ntFd3bmStXQQsAsjPz7dFRUXnWLZ0R3FxMerj4FM/B5/6OPjUx+7Und3dq4FRxpg8Y0wUcCOw5IQ2/4szisYYk46z+3tXAOsUERHpd7oMaWttO3AH8BqwGXjOWrvJGPMTY8wCf7PXgGpjTAmwDPiutbY6WEWLiIj0B906Jm2tXQosPeG5H3a6b4G7/TcREREJAK04JiIi4lIKaREREZdSSIuIiLiUQlpERMSlFNIiIiIupZAWERFxKYW0iIiISymkRUREXEohLSIi4lIKaREREZdSSIuIiLiUQlpERMSlFNIiIiIupZAWERFxKYW0iIiISymkRUREXEohLSIi4lIKaREREZdSSIuIiLhURKgLEBGREKreCcsfZvL25VA7DQYW+G/jISEz1NX1ewppEZH+qGIdvPcbKHkRwqPwJYyCnctg/TMdbeIzIHOcE9hHwztjDETGhK7ufkYhLSLSX1gLe951wnnn2xCdBBd/C2Z8g3VrSigqKoKmaji4CQ5sggMbnZ9rHof2VmcbJhzSRsLAcR0j7oEFkJwLxgSxdMv+ulZKKuop2V/Ppoo6Zo5I55aZw4L2mW6gkBYR6et8Pti6FN57EMo/hPhMmPtjmPpliEn2NypxfsSnQd4lzu3Y+71Qs8sf3P5b+VrYtLijTXSSE9aZncI7cyzEJJ11ue1eH7uqmiipcMK4ZH89JRX11DZ7AOdvgby0eKYMTTmn7uhNFNIiIn1Vexts+BssfwiqtsGAoXDVgzDxcxAZ2/3thIVD+ijnVnBtx/Ot9XBwc6eR9ybn89Y83tFmwFD/aLtTeKcOd7YJNB1pZ0tlfacRcj1bKxs40u4DICoijDFZicwbn8W4QUmMy05iTFYS8dH9I776x7cUEelP2ppg7dOw4ndQX+YE42ceh3HXQngAf+3HJMGQC53bUdZCXenxo+4Dm2DbK2Cd4G0Pi6Y8chibvLmsaR3EZt8QtvhysXFpFGQn8cWLhjIuO4mC7GSGp8cTEd5/T0RSSIuI9BXNNfDBn2DVH6GlBobMhE89BCPnBvV48XGMwZeUyx5PKptaCylprqekoZ4dtYcY0LybsWH7yDelTKSci1nDlRGHj73VxmVhogsgsgDCxoMdB3Y0EN0ztbuQQlpEpLerK4f3H4EP/wyeJhg9Dy7+NgyZEfSPbvV42VrZcOy48aaKOrZUNtDc5gUgIswwamAiM/JzKMgex7jsJMYOSiI5NtLZQOPBYxPUzIES5/6qP4K3zXk9LALSRx9/aljmOEjK7rk/PEJIIS0i0ltVbXeON6//q7MrecL1MOsuJ8yCoLap7bgwLtlfz85DTXh9FoCE6AjGDUris1NzGZedxLhBSYwamEB0RPjpN5qQCQmXwYjLOp7zepzztw9shIMlzu7yfSud491HxQyAC78Gs+8Lynd1C4W0iEhvU77WOY1q80sQEQ1TvgQz74CUYQHZvLWWstoWJ4j9E7pKKuqpqGs91iYrKYaC7CSuKHAmdBVkJ5OTEktYWABGt+GRkDnGuXXWcrgjtA9scial9XEKaRFxp/r9sHkJbH6JwsN1wNUwbBYMnto/F9OwFnb/E9590PkZnQyfuBsu/DokZJzzZls9XnYcbOTdMg//fGkTmyrq2by/nobWdgDCDIzISGBaXuqxMB47KJG0hBAcJ44dAENnOrd+QiEtIu7RcMAJ5k2LYe8KwELmOCI9LVD8c+dxeDTkTIWhs5zQzpkOUXGhrjx4fD7Y8pIzcq74CBIGwuU/gSm3ntU5yEdHx1sqG9iyv54tBxrYWtnA7qqO3dWxkaWMGZTIgsJsCrKTGZedRP7ARGKjzrC7WoJKIS0iodV40B/M/wt73gOss/Rk0b855+Rm5LOmuJiiCwth7/uwd7nT7t1fwzv/AWGRMHhyR2jnzoDohFB/q/PX3gYf/xWWPwzV2yElD65+CApv6nJPQl2Lh62VDWyprD8WytsONNJ4pP1Ym9zUWMZkJTF/fBb5WYnU79vCwitnEx6I3dUSMAppEel5TVUdI+Y97zmTntJHw6Xfc4I5c+zJ74lNgTFXOjeA1jrYtwr2vgd7ljth9t6DzrKV2RP9oX2xM8P52KpavcCRRlj7lHOOc0MFZE2A659wznEOO35E6/H62HWo6bgw3lrZcNyx46SYCMYMSuK6yYMZk5VEflYi+VmJJJywGEhxzTYFtAsppEWkZzRVO7ttNy2G3e+C9TprQH/iO1DwaSeYz+aUmphkGP1J5wZOuJWu8o+0l8PKP8CK34IJc4Ju6MXOSHvIRRCXGpzveD6aquGDRfDBo9BS69R7zf+DEXOwQGV9K1sqnV3UW/Y7obzzUCMer7OrOjLcMCIjgel5qeRnJTFmUCJjshLJSorB9INTlfoqhbSIBE9zDWz5hxPMu/7pBHPqcOcc3oJPO6cKBSpAohNg5BznBtDWDGWrO0J79WOw8hHAOOfaDpvljLaHznLWqw6Vw6XOOc5rnwJPM+2j5rMz/yt86B3N1k31bH5rJVsrG6hr8Rx7S3ZyDPlZiRTlZzJ2kDMyHp6eQFRE/12Zq69SSItIYDXXwJaXoeR/YVcx+Nqd46mz7nKCOWtCzyxCERUHwy91bgCeVihf4wT23vfgw6ecRTMAMsZ2hPawi3vkOsreA1toWvafJGx9AaxlZcJl/DH8U7yzIR02HAE2EB8VTn5WIlddMIgxWYnO7uqBiSTHRQa9PnEHhbSInL+WWtiy1D9iXuYE84ChcNEdTjAPKgz96lCRMU4AD7sY+J4zMatirXNMfO9yWPeMM9oGSBvlD23/LvKk7PP66KrGI2zZ70zkatq1imnlTzHjyEoiieQp7xwe915JTFIe+UMSuWdaImMGJTEmK5HBAwJ03rH0WgppETk3rXUdwbzzbfB5IHkIzPiGE8zZk0IfzGcSEeVMKhsyA/iOs8rV/vUdob3xBWeZTXD2BHQO7QFDTtqc12eprG+ltKaZfdXNbPWf4rSlsp6qxiNcHLaRb4S/yMzwEppMAiuyb6Fmwm1MGzqUmzITiInUaU5yMoW0iHRfaz1sfcUfzG856ysn5TjLMxZc55wK5eZgPpPwSOf865ypcPG3nGsoV37s3z2+HLv5H5iP/huA5ths9iVOYkPkBJZ7x7C2LpmKulba/ecbA8REhjE2M467Bm1i/uFnSW/YjC8hC2Y+QPyUL3FxdGKovqn0IgppETmzIw2w9VUnmHe8Cd4jkDQYpt/unBaUM7X3BnMn1lpqmz2U1TZTWtNCaW0zZbURlNZMp7R2PBWNN5Pn3cuFYZu50LuZ6c3vcIN5mRuA2ogM9mdPoTHrQsLyPkFG7ghy971E2IqHoXQnpI6AT/2WsMIbnWU8RbpJIS0iJzvSCNv8wbz9DSeYE7Nh2m3OruzBUyGs980kbmj1dArgFkprminrdL/Jf+WmowbERZKbEseYrETmjh1IbkoBOanXk5sSS/yAWDi8Hfa8R8re5aTsWQ4bX4WNOAus+DzOsfgb/gxjF5x0jrNIdyikRcTR1gTbXvMH8+vQ3goJWTD1VieYc6a7Pphb2rwdoVvb7A/ho/dbjjuNCSA+Kpzc1DhyUuK4aEQaOSlx5KbE+p+LJTGmi1nUmWOd2/SvOmtrV+9wjmkfLIH8+TB8dp/YyyCho5AW6c/amp1A3rTYCej2Fmdt6MlfdII5d4argrmt3UfF4Y7QLattpvTYiLiFqsYjx7WPjggjxx+6E3MHkJsSdyyAc1PiGBAXGbiFPoyB9FHOTSRAFNIi/Y2nxdmFvWmxs0vb0wzxGTDp804wD7nIFbtmrbWs3VfLS+v3s2JzC//2/ltU1rdiO+ZmERFmyB4QS25qLHPHZh4L5JyUOHJTY0mPj9YpTNKrKaRF+iKfDxoPQO0eqN3t/7kHanY71+H1NEFcOhTe6ATz0FmuCeYtlQ0sWV/BknUVlB9uIToijKGJcNGItONHwqlxZCXFaL1p6dO6FdLGmHnAw0A48Ji19henafcZ4HlgmrV2TcCqFJGTeVrg8D4neI+GcOdAbu+4yAImzDlVKmUoTPwcjL3aOec33B1/p++rbmbJ+nKWrK9g24FGwsMMnxiVzj2fHM0nC7JY8/57FBVNDHWZIj2uy/+hxphw4BHgcqAMWG2MWWKtLTmhXSJwF7AqGIWK9DvWOleLOnEkfPR+Q8Xx7SPjITXPuWjFyLmQMsx5nJIHybnO4h0ucrChlZc/3s+L6ypYV3oYgGnDUrj/2vFcOT6LtASdqiTSnT+jpwM7rLW7AIwxzwLXACUntLsf+CXw3YBWKNKXtbdBXak/fDuPiP23tsbj2ydmO+E7YrbzMyXP/3MYxKe7fiZxXYuH1zZWsmR9BSt2VuGzMG5QEvfOH8OnCrMZPCA21CWKuEp3QnowUNrpcRlwYecGxpjJQK619mVjjEJa5ChrnXWtjwZwzQlBXF/uXEv5qIiYjvAd9olOo+FhzlrYkTEh+BLnp9Xj5a3NB3lxXTnFWw/R5vUxNC2Ob84eyYLCbEYN1MpbIqdz3gekjDFhwIPAl7rR9nbgdoCMjAyKi4vP9+PlDBobG9XHPaCpoY6VrzxLbEslMa0H/D8riW2pJLblABHepuPat0UOoCV2IC2xI2gdMJOW2CxaY7JoiR1IW1Tq8aPhVqACqNgP7O/Jr3Ve2n2WkmovK/d7WXugnVYvDIg2FOWEM2NQFHnJYMx+yjfvp3xz19vTv+XgUx+7U3dCuhzI7fQ4x//cUYnAeKDYf75hFrDEGLPgxMlj1tpFwCKA/Px8W1RUdO6VS5eKi4tRHwdQUzVUbet02w5V27C1ezF0Gg2HRzkXYMgaASlzOkbC/ltUVDxRQHKIvkaw+HyWD/fV8uK6cpZuqKSmqY2kmAiunZzLgsJsLhyeds4zsfVvOfjUx+7UnZBeDYwyxuThhPONwOeOvmitrQPSjz42xhQD39HsbumVfF44vNcJ4ENbjwtjWmo62kXEOJczzJ7IvsQpDJ1Y1LFrOnGQK05n6gnWWkr217NkfQUvraugoq6VmMgw5o4dyDUTB3PJ6HSiI/pHX4gEQ5chba1tN8bcAbyGcwrWE9baTcaYnwBrrLVLgl2kSMAdaYTq7R0BfDSMq3c4V3Y6Kj4D0kfDuAXOz6O35NxjK3HtLi5m6OSi0HyPENlT1eScy7y+gh0HG4nwnzL1r/PGcPm4gcRHu+PULpHerlv/k6y1S4GlJzz3w9O0LTr/skQCwFpoqDxp9zRV26G+rKOdCXdGwemjYdTlHUGcNhLiUkNWvtscrG/lpY/3s2RdOevL6gCYnpfKA9eO58oJg0iNd9cpXiJ9gf7cld6vvc2ZPd05jA9tdX62NXS0i0p01lUedrF/jWV/GKfm6fKBp1HX7OGVjftZsr6C93dVYy0UZCdx35VjuPqCbLJ1ypRIUCmkpfdoqYWqHVB1wrHimt1gO11iMGmwE8ITb/IHsT+QEwe5/jxiN2hp8/Lm5gO8uK6Cf247iMdryUuP587LRrFgYjYjMhJCXaJIv6GQFnfx+ZzFPU48Vly1DZoOdrQLj4LUEZA5zll7+mgYp42EaJ13e7Y8Xh/vbj/EknUVvF5ygOY2LwOTornlomFcM3Ew4wcnBe5qUSLSbQppcYemKnj5no7LJR4VmwLp+TD6ik4Tt0Y5C3u4ZN3p3srns6zeU8OS9RUs3bCf2mYPybGRXDMxmwWFg5mel6qLV4iEmH7LSejtfBsW/x9nd/bkWyBrfEcgx6d3/X7pNp+v0ylT6yvYX9dKbGQ4l48byILCbC4ZnUFUhHuuHy3S3ymkJXTaj8BbP4H3fwcZY+DmF5yAlvPS3NZOaU0Le6ub2FfTTGlNM/v8t9LaFtrafUSEGS4dncG9851TpuKi9KtAxI30P1NC49A2+PuXoXIDTPsqfPJ+iNRM4e7w+SwHG46cMoT31bRQ1XjkuPYJ0REMSY1jVGYic8YOZGRmApePHUiKTpkScT2FtPQsa+HDJ+HV+yAqDm56FvLnh7oq12k60k5pbTP7qptPOxo+KszAoORYhqTGMWdMJkPS4shNjWOI/5YSF6lJXyK9lEJaek5zDSz5F9jyDxg+Gz79R0jMCnVVIeHzWQ40tJ4yhLszGj4awkNT48geEKvjyCJ9lEJaesauYmdyWFMVfPKnMOMbx5bV7KtONxreW9NMWTdGw0M6jYYHaDQs0i8ppCW42ttg2QOw/LfOqVOf+ysMKgx1VefE57O0eX20+yyedh8er48j7T621ng5tKb0uBAurWmmqrHtuPcnRkcwJC2O/IGJXN5pNDxEo2EROQ2FtARP1Q74+22wfx1MuRWu+JlzHPo0Wj1e9te10u710eb14fHak+57vD7aTnPf47X+nyfcb7d4fP7n2n20+5z3neq+x2tp63Tf0+47Fsxenz39d/3gY8IMZA9wRsNzTwhhjYZF5FwopCXwrIWP/gte+Z6zJvbCv8DYq0/bvN3r469rSvnNG9tOGn2ei4gwQ2R4GBHhhqjwsFPejwwPO/Y4Lsr5Gel/PjI8jKgIQ0SY//kIQ+RJ9w2REc5zB/ds41OzZ5A9IJbIcI2GRSRwFNISWC218NJdUPIi5F0Cn34UkrJP27x460F+tnQz2w40Mn1YKvfOzyUmMoyIMCcoj4Zm5wDtfP+k8A0LI6yHV8kqbtzJ0LT4Hv1MEekfFNISOHvegxduh8YDMPf/wsw7Tzs5bEtlPT99eTPvbq9iaFocf7x5ClcUDNTuYBGRThTScv68Hij+Obz7IKQOh6+8CdmTTtn0YEMrv3ljG39dXUpiTCT/fvU4vjBjqCZNiYicgkJazk/1Tnjhq1D+IUz6Asz7BUSffCnDVo+Xx9/bze+X7eBIu48vzczjzjkjGRCnVa9ERE5HIS3nxlpY/wws/S6EhcMNT0HBtSc18/ksL64v51evbqWirpUrCgZy7/yx5KXrGK6ISFcU0nL2Wg7DP74Nm16AoRfDdY9Ccs5JzT7YXcMDL5fwcVkdEwYn8+DCicwYnhaCgkVEeieFtJydvSucyWH1FXDZv8PF33ZG0p3sqWriF69s4dVNlQxKjuHBzxZy7cTBPT7rWkSkt1NIS/d42+Gfv4R3fw0DhsJtb0DOlOOa1DV7+O3b23n6/T1Ehodxz+Wj+conhhMbFX7qbYqIyBkppKVrNbudyWFlq6Hwc3Dlf0B04rGX29p9/PfKvTz81nYaWj18dmoud18+msykmBAWLSLS+ymk5czW/xVevgdMGHzmcZhw/bGXrLW8XnKAny/dzJ7qZj4xKp37rhzL2EFJISxYRKTvUEjLqbXWwcvfgQ3PwZCL4LpFMGDIsZc3lNXxwMslrNpdw8jMBJ68dRpFozO0GImISAAppOVk+1bBC1+BunKY/X24+G4Id/6lonpRAAAPIElEQVSp7K9r4VevbuWFj8pJi4/i/mvHc9O0XCK0ZrWISMAppKWDtx3e/U9ngljyYPjyq5A7HXCujfzoP3ey6N1d+Cx8vWgEXy8aQVJMZIiLFhHpuxTS4qjd65xaVboSJnwWrvo1xCTj9Vme/7CUX7++jUMNR1hQmM13r8gnN/X0l5wUEZHAUEgLbHjeWZzEWrjuT3DBZwF4d/shfvryZrZUNjBlaAqLvjCFSUNSQlysiEj/oZDuz440OMt6rn8GcqY5AZ2ax/YDDfxs6WaWbT1Ebmosj3xuMldOyNKkMBGRHqaQ7q/K1sDfb4PD++DS78El/0pVi5eH/ncDz3xQSlxUOPddOYZbZg4jOkKLkYiIhIJCur/xeeG9B2HZzyEpG760lNbs6Tz57h5+v2wHzR4vN184hLvmjiY1XleoEhEJJYV0f1JX5kwO27scCq7DXv0gL21r4ZfP/JPywy3MHZvJvfPHMjLz5EtNiohIz1NI9xebFsNLdzkj6Wv/wIcD5vHAkyV8tO8w4wYl8avrL2DmyPRQVykiIp0opPu6I43wyvdg3X9D9mT2z/0dD6w8wssfv09mYjS/uv4CrpucQ7iuUCUi4joK6T4ssX47PHo31Oyi9aJv85DnMzzx+D7Cwwx3zRnF1y4dTlyU/gmIiLiVfkP3RZUb4YNHmfTRX7CJA3l92p+4d1Uyh1v2cf3kHO75ZD5ZybpClYiI2ymk+wqvB7b8A1Ytgn0rsBGxbBwwh3/3fJH174Zx0fAkfnD1WAqyk0NdqYiIdJNCurdrPARr/wyrn4CGChgwhP0Xfp8f7pvIG7s9DE+P57EvjmXO2EwtRiIi0ssopHur8rXwwSLY+HfwtsHw2VTP/gU/257DC+9UkhJnuHlsFD+6+RIidYUqEZFeSSHdm7S3QcmL8MGjULYaohJg8i00Tfwyv98YxmMv7MZykK9dMoJvzB7B2pXLFdAiIr2YQro3aKiENU/Amieh6SCkjoB5v6R9wkKe2VDPQ09so7qpjWsnZvOdK/LJSdEVqkRE+gKFtFtZC6UfOKPmkhedRUhGXQ7Tv4YdMZu3tlTx8z+uZ+ehJi7MS+XJq8ZyQc6AUFctIiIBpJB2G0+rc5z5g0dh/3qITobpX4Npt0HaCDaW1/HTx1bz/q5qhmfE86cvTmWuJoWJiPRJCmm3OFzq7NJe+xQ0V0PGGLjqQbhgIUQnUH64hf/86zpe+Kic1Pgo7r+mgBunD9ExZxGRPkwhHUrWwp73nFHzlped5/KvhOm3Q94lYAwNrR7+8OoWHn9vNxb4etEIvl40gqSYyJCWLiIiwaeQDoW2Jvj4OfjgT3BwE8SmwMw7nV3aA4YA4PH6ePaDvTz05naqm9q4btJg7rkin8EDYkNcvIiI9JRuhbQxZh7wMBAOPGat/cUJr98NfAVoBw4BX7bW7g1wrb1fzW5Y/Rh89F/QWgdZE2DB72DC9RDphK+1ljc3H+Tnr2xm16EmZgxP5c9XjmNCjlYKExHpb7oMaWNMOPAIcDlQBqw2xiyx1pZ0avYRMNVa22yM+TrwH8DCYBTc61gLu5Y5y3VuexVMGIxb4EwGGzIDOk342lBWx0+XlrByVw3DM+J57ItTtVKYiEg/1p2R9HRgh7V2F4Ax5lngGuBYSFtrl3VqvxK4OZBF9kpHGmDdM86qYNXbIT4DLvkOTP0yJGUf17T8cAu/fm0riz8qJy0+ivuvHc+N03I1KUxEpJ8z1tozNzDmemCetfYr/sdfAC601t5xmva/AyqttQ+c4rXbgdsBMjIypjz33HPnWb77xDaXM7j8ZbIq3ybC20J94ijKB1/FwcyLsWHHT/Zq9lj+scvD63s9GOCKYZFcNTyS2IjAjJwbGxtJSEgIyLbk9NTPwac+Dj71cfDNnj37Q2vt1LN5T0AnjhljbgamApee6nVr7SJgEUB+fr4tKioK5MeHjs8HO96AVY/CzrcgLBLGXwfTv0ZSzhSSgLGdmnu8Pp75YB8PvbudmiYP100ezHc+mU92gCeFFRcX02f62MXUz8GnPg4+9bE7dSeky4HcTo9z/M8dxxgzF/g+cKm19khgynO5lsOw7i/OLO3a3ZA4CGZ/H6Z8CRIyT2pureWNkgP84pUt7Kpq4qLhaXz/qrGMH6xJYSIicrLuhPRqYJQxJg8nnG8EPte5gTFmEvAozm7xgwGv0m0ObnaONa9/FjzNkDsD5vw7jF0A4ac+f3l96WF+unQzH+yuYURGPI/fMpXLxmhSmIiInF6XIW2tbTfG3AG8hnMK1hPW2k3GmJ8Aa6y1S4BfAQnA3/yhs89auyCIdfc8bztse8XZpb3nXQiPhgk3wIW3w6DC076trLaZX722lRfXVZAWH8UD/klhEZoUJiIiXejWMWlr7VJg6QnP/bDT/bkBruv8edvB0wRtzc7iIZ4m52dbc6f7/pun+fSPPc3Q1ggttc65zcm5MPfHMOmLEJ922o+vb/XwyLIdPLl8Dwa4Y/ZIvnbpcBK1UpiIiHRTaFccsxa8bScEZKcwbWv0h2Tn+2cK006vec/ysHhkPETFQVS8/77/cXyG/348jJwDo+dD+Om7zeP18T+r9vHQm9s43OLhukk5fOeK0QxK1kphIiJydkIW0gmNu+EnaWC93X+TCe8IzMi4jvtxqRCZA1EJpw7aqAR/+8734ztuEbEQdn67n621vO6fFLa7qomZI9K470pNChMRkXMXspD2RCbCrDuPD8vIuNMErf8WHnXcCl1usa70MD97eTMf7KlhZGYCT3xpKrPzNSlMRETOT8hC+kh0Osz9Uag+PiBKa5xJYUvWV5CeEMVPPz2ehVM1KUxERAJDV8E6B3UtHn7vnxQWFgb/ctlIvnbpCBKi1Z0iIhI4SpWz0Nbu439W7eXht7ZzuMXDZybncM8nNSlMRESCQyHdDQ2tHpZtPcRv3tjG7qomZo10JoUVZGtSmIiIBI9C+hRaPV7W7qtlxY5qlu+s4uOyOrw+y6jMBJ68dRpFozM0KUxERIJOIQ20e31srKhn+Y4qVuysYs2eWo60+wgPM1yQk8zXLx3BzJFpTB+WqklhIiLSY/plSFtr2X6wkeU7qli+o5pVu6tpaG0HYExWIp+/cCizRqYxPS9VK4SJiEjI9JuQLq1pZsVOJ5RX7KymqtFZkWxIahxXXzCImSPSuWhEGukJ0SGuVERExNFnQ7qq8QgrdlazYkcVK3ZWs6+mGYD0hGhmjUxjlj+Uc1PjQlypiIjIqfWZkG5o9bBqV40TzDur2FLZAEBiTAQzhqdx66xhzBqZzqjMBE36EhGRXqHXhnSrx8vavbWs2Hn8DOzoiDCmDUvlu1dkM2tkOuOzkzTZS0REeqVeE9JnmoFd2GkG9uQhKcREhoe6XBERkfPm2pDWDGwREenvXBXSmoEtIiLSIaQhrRnYIiIipxeykC5v9DH1gTcBzcAWERE5lZCFdLiB716RrxnYIiIipxGykM6KD+Obs0eG6uNFRERcT8NXERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUgppERERl1JIi4iIuJRCWkRExKUU0iIiIi6lkBYREXEphbSIiIhLKaRFRERcSiEtIiLiUt0KaWPMPGPMVmPMDmPMvad4PdoY81f/66uMMcMCXaiIiEh/02VIG2PCgUeA+cA44CZjzLgTmt0G1FprRwK/AX4Z6EJFRET6m+6MpKcDO6y1u6y1bcCzwDUntLkGeMp//3lgjjHGBK5MERGR/qc7IT0YKO30uMz/3CnbWGvbgTogLRAFioiI9FcRPflhxpjbgdv9D48YYzb25Of3Q+lAVaiL6AfUz8GnPg4+9XHw5Z/tG7oT0uVAbqfHOf7nTtWmzBgTASQD1SduyFq7CFgEYIxZY62derYFS/epj3uG+jn41MfBpz4OPmPMmrN9T3d2d68GRhlj8owxUcCNwJIT2iwBbvHfvx5421prz7YYERER6dDlSNpa226MuQN4DQgHnrDWbjLG/ARYY61dAjwO/JcxZgdQgxPkIiIich66dUzaWrsUWHrCcz/sdL8VuOEsP3vRWbaXs6c+7hnq5+BTHwef+jj4zrqPjfZKi4iIuJOWBRUREXGpkIR0V8uMyvkxxuQaY5YZY0qMMZuMMXeFuqa+yhgTboz5yBjzj1DX0hcZYwYYY543xmwxxmw2xlwU6pr6ImPMt/2/KzYaY54xxsSEuqbezhjzhDHmYOdTjY0xqcaYN4wx2/0/U7raTo+HdDeXGZXz0w7cY60dB8wAvqk+Dpq7gM2hLqIPexh41Vo7BihEfR1wxpjBwJ3AVGvteJwJwpr8e/7+DMw74bl7gbestaOAt/yPzygUI+nuLDMq58Fau99au9Z/vwHnF9uJq8TJeTLG5ABXAY+Fupa+yBiTDFyCc/YI1to2a+3h0FbVZ0UAsf51LuKAihDX0+tZa9/BOdups85LaD8FXNvVdkIR0t1ZZlQCxH9FsknAqtBW0ic9BPwr4At1IX1UHnAIeNJ/SOExY0x8qIvqa6y15cCvgX3AfqDOWvt6aKvqswZaa/f771cCA7t6gyaO9WHGmATg78C3rLX1oa6nLzHGXA0ctNZ+GOpa+rAIYDLwB2vtJKCJbuwelLPjPy56Dc4fRdlAvDHm5tBW1ff5F/zq8vSqUIR0d5YZlfNkjInECei/WGtfCHU9fdAsYIExZg/OIZvLjDH/HdqS+pwyoMxae3Qv0PM4oS2BNRfYba09ZK31AC8AM0NcU191wBgzCMD/82BXbwhFSHdnmVE5D/7LhD4ObLbWPhjqevoia+2/WWtzrLXDcP4Nv22t1egjgKy1lUCpMeboRQnmACUhLKmv2gfMMMbE+X93zEET9IKl8xLatwAvdvWGHr0KFpx+mdGerqOPmwV8AdhgjFnnf+4+/8pxIr3JvwB/8f9Bvwu4NcT19DnW2lXGmOeBtThnhnyEVh87b8aYZ4AiIN0YUwb8CPgF8Jwx5jZgL/DZLrejFcdERETcSRPHREREXEohLSIi4lIKaREREZdSSIuIiLiUQlpERMSlFNIiIiIupZAWERFxKYW0iIiIS/1/j7ukzCWcNVUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history, label, epcohs, min_value, max_value):\n",
    "    data = {}\n",
    "    data[label] = history.history[label]\n",
    "    data['val_'+label] = history.history['val_'+label]\n",
    "    pd.DataFrame(data).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.axis([0, epochs, min_value, max_value])\n",
    "    plt.show()\n",
    "    \n",
    "plot_learning_curves(history, 'acc', epochs, 0, 1)\n",
    "plot_learning_curves(history, 'loss', epochs, 1.5, 2.5)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
